L' atelier Assembly est le nouvel atelier d'assemblage intégré de FreeCAD. Il utilise le solveur open-source d'Ondsel.
Cet exemple est temporaire et pourra être supprimé lorsque des descriptions/tutoriels appropriés seront disponibles.
L'assemblage à créer se compose de quatre parties : une base, une tige coulissante, une manivelle et une bielle. Elles sont reliées par quatre articulations.
Pièces assemblées : la base (ambre), la tige coulissante (bleu clair), la manivelle (rouge), la bielle (vert)
Dans cet exemple, toutes les pièces et l'assemblage sont créés dans un seul document.
Les géométries cylindriques des objets sont soit parallèles, soit perpendiculaires. Le reste des formes n'est pas pertinent pour cet exemple, à moins qu'il n'y ait des collisions. En gardant cela à l'esprit, vous pouvez modéliser vos propres objets ou les créer à l'aide du code Python ci-dessous. Le code créera un nouveau document avec les quatre objets (plus simples que dans les images). Il suffit de copier-coller les lignes suivantes dans la console Python :
import FreeCAD as App
import FreeCADGui as Gui
import Part
doc = App.newDocument()
box1 = Part.makeBox(140, 40, 7, App.Vector(0, -20, 0))
cyl1 = Part.makeCylinder(4, 8, App.Vector(120, 0, 7))
box2 = Part.makeBox(20, 12, 10, App.Vector(5, -6, 7))
cyl2 = Part.makeCylinder(6, 20, App.Vector(25, 0, 17), App.Vector(-1, 0, 0))
cyl3 = Part.makeCylinder(4, 20, App.Vector(25, 0, 17), App.Vector(-1, 0, 0))
shape = box1.fuse([cyl1, box2, cyl2]).removeSplitter().cut(cyl3)
base = doc.addObject("Part::Feature", "Base")
base.Shape = shape
box1 = Part.makeBox(4, 12, 12, App.Vector(-12, -6, 0))
box2 = Part.makeBox(14, 12, 4, App.Vector(-8, -6, 0))
cyl1 = Part.makeCylinder(4, 8, App.Vector(0, 0, 4))
cyl2 = Part.makeCylinder(4, 88, App.Vector(-12, 0, 6),App.Vector(-1, 0, 0))
shape = box1.fuse([box2, cyl1, cyl2]).removeSplitter()
slider_rod = doc.addObject("Part::Feature", "SliderRod")
slider_rod.Shape = shape
slider_rod.Placement.Base = App.Vector(100, -40, 0)
cyl1 = Part.makeCylinder(7.5, 4)
box1 = Part.makeBox(15, 30, 4, App.Vector(-7.5, 0, 0))
cyl2 = Part.makeCylinder(7.5, 4, App.Vector(0, 30, 0))
cyl3 = Part.makeCylinder(4, 6, App.Vector(0, 30, 4))
cyl4 = Part.makeCylinder(4, 4)
shape = cyl1.fuse([box1, cyl2]).removeSplitter().fuse(cyl3).cut(cyl4)
crank = doc.addObject("Part::Feature", "Crank")
crank.Shape = shape
crank.Placement.Base = App.Vector(125, -70, 0)
cyl1 = Part.makeCylinder(6, 4)
box1 = Part.makeBox(50, 12, 4, App.Vector(0, -6, 0))
cyl2 = Part.makeCylinder(6, 4, App.Vector(50, 0, 0))
cyl3 = Part.makeCylinder(4, 4)
cyl4 = Part.makeCylinder(4, 4, App.Vector(50, 0, 0))
shape = cyl1.fuse([box1, cyl2]).removeSplitter().cut(cyl3.fuse(cyl4))
connecting_rod = doc.addObject("Part::Feature", "ConnectingRod")
connecting_rod.Shape = shape
connecting_rod.Placement.Base = App.Vector(25, -70, 0)
mat = base.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
base.ViewObject.ShapeAppearance = (mat,)
mat = slider_rod.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
slider_rod.ViewObject.ShapeAppearance = (mat,)
mat = crank.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.70, 0.30, 0.20, 0.0)
crank.ViewObject.ShapeAppearance = (mat,)
mat = connecting_rod.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.0, 0.0)
connecting_rod.ViewObject.ShapeAppearance = (mat,)
doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()
La commande Assemblage permet d'ajouter un assemblage au document.
Arborescence des pièces et des assemblages
Dans la vue en arborescence, glissez et déposez les pièces sur l'objet Assemblage. Elles peuvent maintenant être traitées par le solveur de l'assemblage.
Les pièces sont maintenant dans le conteneur d'assemblage
Pour maintenir l'assemblage dans la position souhaitée, la base doit être verrouillée ou fixée (en anglais grounded). Sélectionnez la base dans la vue en arborescence ou dans la vue 3D et utilisez la commande Activer/désactiver le blocage. Cette commande fixe la position de la base par rapport au système de coordonnées local (LCS) du conteneur Assembly. Un objet GroundedJoint est ajouté au conteneur Joints.
Développez le conteneur Joints pour trouver l'objet GroundedJoint
Au lieu des deux étapes mentionnées ci-dessus, il est également possible d'utiliser la commande Insérer un composant pour placer des objets à l'intérieur d'un assemblage. Le premier objet devient automatiquement la partie fixée. Il faut donc commencer par l'objet Base. La commande crée des liens et les objets d'origine reste en dehors de l'assemblage. Pour éviter toute confusion, il est conseillé de les rendre invisibles.
Une liaison relie exactement deux éléments de pièces différentes. Ils peuvent être sélectionnés avant que la commande de la liaison souhaitée ne soit lancée (tout nombre d'éléments sélectionnés autre que deux entraîne une sélection vide).
Les éléments définissent la position et l'orientation d'un LCS représenté par un cercle rempli sur le plan local XY et trois lignes le long des axes locaux X (rouge), Y (vert) et Z (bleu).
Éléments sélectionnés + Créer une liaison pivot → manivelle réarrangée
Déplacez la manivelle à l'aide du bouton gauche de la souris. Seule une rotation autour du pivot doit être possible.
Éléments sélectionnés + Créer une liaison glissière → tige coulissante réarrangée
Déplacez la tige coulissante à l'aide du bouton gauche de la souris. Seul un déplacement le long de sa ligne centrale devrait être possible.
Éléments sélectionnés + Créer une liaison pivot → bielle réarrangée
Déplacez la bielle à l'aide du bouton gauche de la souris. Seule une rotation autour du pivot doit être possible.
S'il y a plusieurs joints dans une ligne, nous devons aider le solveur à trouver une solution raisonnable.
Si nécessaire, cliquez et faites glisser les pièces vers une position plus facile à calculer.
Éléments sélectionnés + Créer une liaison pivot glissant → assemblage terminé
Dans l'assemblage terminé, utilisez le pointeur de la souris pour faire glisser les pièces en fonction des liaisons utilisées.
L'axe de la tige coulissante est orienté de manière redondante. Son axe central est parallèle à l'axe de la base par l'intermédiaire de la chaîne cinématique allant de la base à la manivelle et à la bielle, c'est-à-dire que son axe Z local ne peut pivoter autour d'aucun axe X ou Y. L'articulation du coulisseau empêche également la rotation de son axe Z autour de deux axes locaux. L'articulation coulissante empêche également la rotation de son axe Z autour de deux axes locaux, ce qui se traduit par deux degrés de liberté contraints de manière redondante. Une articulation cylindrique à la place de l'articulation coulissante ne bloquerait qu'une rotation, ce qui se traduirait par un seul degré de liberté contraint de manière redondante.
Pour contrôler la disposition de l'assemblage par l'angle entre la base et la manivelle, nous devons remplacer l'articulation à rotule entre les deux par une articulation fixe. Pour contrôler la position de l'assemblage par l'angle entre la base et la manivelle, nous devons transformer la liaison pivot en liaison fixe. Pour ce faire, double-cliquez sur l'objet Pivot dans l'arborescence. Dans la fenêtre de dialogue, changez la valeur Pivot en Fixe et modifiez la valeur de la rotation comme vous le souhaitez (le mouvement doit suivre l'action de la molette de la souris).
Remarquez qu'un changement de type de liaison modifie l'étiquette de la liaison mais pas son nom. Dans ce cas, l'étiquette est remplacée par "Fixed".
Pour animer l'assemblage, nous pouvons modifier la rotation (Offset1.Angle) de la liaison fixe avec du code Python. Il suffit de copier-coller les lignes suivantes dans la console Python :
import math
import FreeCAD as App
import FreeCADGui as Gui
actuator = App.ActiveDocument.getObjectsByLabel("Fixed")[0]
for angle in range(0, 361, 10):
# A full rotation of the Crank in steps of 10°
actuator.Offset1.Rotation.Angle = math.radians(angle)
App.ActiveDocument.recompute()
Gui.updateGui()
La fin de l'intervalle doit être supérieure à 360 pour que cet angle soit également considéré comme un résultat valide.
Cet exemple est temporaire et pourra être supprimé lorsque des descriptions/tutoriels appropriés seront disponibles.
Dans cet exemple, un joint de Cardan est créé.
L'assemblage se compose de trois éléments solides : deux fourches identiques et une croix. Deux éléments non solides supplémentaires, Axle1 et Axle2, représentant les arbres coudés, sont également nécessaires. Les arbres et les éléments solides sont reliés par plusieurs liaisons.
Dans cet exemple, toutes les pièces et l'assemblage sont créés dans un seul document.
Le code Python ci-dessous créera un nouveau document avec quatre objets (seulement 1 fourche). Il suffit de copier-coller les lignes suivantes dans la console Python :
import math
import FreeCAD as App
import FreeCADGui as Gui
import Part
doc = App.newDocument()
axle1 = doc.addObject("Part::Line", "Axle1")
axle1.X2 = -80
axle1.Y2 = 0
axle1.Z2 = 0
axle2 = doc.addObject("Part::Line", "Axle2")
axle2.X2 = 80
axle2.Y2 = 0
axle2.Z2 = 0
axle2.Placement.Rotation.Angle = math.radians(20)
sph1 = Part.makeSphere(50, App.Vector(0, 0, 0), App.Vector(-1, 0, 0), 0, 90, 360)
box1 = Part.makeBox(50, 40, 80, App.Vector(-50, -20, -40))
cyl1 = Part.makeCylinder(20, 80, App.Vector(0, 0, -40))
cyl2 = Part.makeCylinder(20, 80, App.Vector(0, 0, 0), App.Vector(-1, 0, 0))
cyl3 = Part.makeCylinder(30, 60, App.Vector(0, -30, 0), App.Vector(0, 1, 0))
box2 = Part.makeBox(30, 60, 60, App.Vector(0, -30, -30))
cyl4 = Part.makeCylinder(15, 80, App.Vector(0, 0, -40))
cyl5 = Part.makeCylinder(15, 80, App.Vector(0, 0, 0), App.Vector(-1, 0, 0))
shape = sph1.common(box1).fuse([cyl1, cyl2]).cut(cyl3.fuse([box2, cyl4, cyl5]))
fork = doc.addObject("Part::Feature", "Fork")
fork.Shape = shape.removeSplitter()
fork.Placement.Base = App.Vector(0, 100, 0)
cyl1 = Part.makeCylinder(15, 80, App.Vector(0, 0, -40))
cyl2 = Part.makeCylinder(15, 80, App.Vector(0, -40, 0), App.Vector(0, 1, 0))
shape = cyl1.fuse([cyl2])
cross = doc.addObject("Part::Feature", "Cross")
cross.Shape = shape.removeSplitter()
cross.Placement.Base = App.Vector(70, 100, 0)
mat = fork.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
fork.ViewObject.ShapeAppearance = (mat,)
mat = cross.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
cross.ViewObject.ShapeAppearance = (mat,)
doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()
L'angle entre les arbres est fixé à 20°. Si l'angle doit être modifié, Axle2 est sélectionné et sa propriété Placement.Angle est ajustée. Cette propriété doit être modifiée avant que Axle2 ne soit déplacé dans l'assemblage.
Attention : les pièces peuvent entrer en collision si l'angle est trop grand.
La commande Assemblage permet d'ajouter un assemblage au document.
Dans la vue en arborescence, glisser-déposer les arbres sur l'objet Assembly.
Sélectionnez les deux arbres dans l'arborescence et utilisez l'outil Bascule du blocage.
Pour les autres objets, nous utiliserons l'outil Insérer un composant :
Éléments sélectionnés + Créer une liaison pivot → + Décalage de +40mm ou -40mm → Fork001 réarrangé
Si vous lancez d'abord l'outil, puis sélectionnez les éléments, vous pouvez cliquer à proximité du bonne extrémité d'Axle1 pour éviter d'avoir à saisir un décalage.
Éléments sélectionnés + Créer une liaison pivot glissant → Cross001 réarrangé
Éléments sélectionnés + Créer une liaison pivot glissant → Fork002 réarrangé
Si nécessaire, inversez la direction de la liaison en utilisant le bouton dans le panneau des tâches.
Éléments sélectionnés + Créer une liaison pivot glissant → Cross001 et Fork002 réarrangés
Le joint de Cardan peut être actionné en déplaçant Fork001 avec la souris gauche.
Si vous voulez vérifier la situation à des angles de rotation distincts, procédez comme suit :
Cet exemple est temporaire et pourra être supprimé lorsque des descriptions/tutoriels appropriés seront disponibles.
Dans cet exemple, un étau est créé.
L'assemblage se compose de trois parties solides : une mâchoire fixe et une mâchoire mobile, ainsi qu'une vis de manœuvre. Un élément supplémentaire non solide, une manivelle, est également nécessaire. La manivelle et les parties solides sont reliées par plusieurs liaisons.
La liaison à vis couple la translation d'une partie d'une liaison à glissière et la rotation d'une partie d'une liaison pivot. La partie vis doit effectuer à la fois un mouvement de translation et de rotation et doit donc faire partie d'une liaison pivot glissant. Pour ce faire, la vis est couplée à la mâchoire mobile par une liaison distance à la manivelle non solide par une liaison parallèle et à la mâchoire fixe par une liaison pivot glissant.
Dans cet exemple, toutes les pièces et l'assemblage sont créés dans un seul document.
Le code Python ci-dessous crée un nouveau document avec quatre objets. Il suffit de copier-coller les lignes suivantes dans la console Python :
import math
import FreeCAD as App
import FreeCADGui as Gui
import Part
doc = App.newDocument()
box1 = Part.makeBox(95, 40, 75, App.Vector(0, -20, -22))
cyl1 = Part.makeCylinder(35, 80, App.Vector(0, -40, 53), App.Vector(0, 1, 0), 90)
box2 = Part.makeBox(20, 80, 30, App.Vector(-20, -40, 58))
cyl2 = Part.makeCylinder(15, 80, App.Vector(-15, -40, 58), App.Vector(0, 1, 0), 90)
box3 = Part.makeBox(5, 80, 15, App.Vector(-20, -40, 58))
box4 = Part.makeBox(35, 24, 24, App.Vector(0, -12, -12))
box5 = Part.makeBox(60, 34, 69, App.Vector(35, -17, -19))
cyl3 = Part.makeCylinder(20, 55, App.Vector(-20, -40, 53), App.Vector(1, 0, 0))
cyl4 = Part.makeCylinder(20, 55, App.Vector(-20, 40, 53), App.Vector(1, 0, 0))
cyl5 = Part.makeCylinder(5, 35, App.Vector(0, 0, 38), App.Vector(1, 0, 0))
box6 = Part.makeBox(7, 88, 15, App.Vector(-22, -44, 75))
box7 = Part.makeBox(95, 90, 10, App.Vector(0, -45, -32))
shape = box1.fuse([cyl1, box2, box6, box7]).cut(cyl2.fuse([box3, cyl3, cyl4, cyl5, box4, box5]))
fixedJaw = doc.addObject("Part::Feature", "FixedJaw")
fixedJaw.Shape = shape.removeSplitter()
fixedJaw.Placement.Rotation.Axis = App.Vector(0, 0, 1)
fixedJaw.Placement.Rotation.Angle = math.radians(180)
box1 = Part.makeBox(35, 40, 75, App.Vector(0, -20, -22))
cyl1 = Part.makeCylinder(35, 80, App.Vector(0, -40, 53), App.Vector(0, 1, 0), 90)
box2 = Part.makeBox(20, 80, 30, App.Vector(-20, -40, 58))
cyl2 = Part.makeCylinder(15, 80, App.Vector(-15, -40, 58), App.Vector(0, 1, 0), 90)
box3 = Part.makeBox(160, 24, 24, App.Vector(-160, -12, -12))
box4 = Part.makeBox(5, 80, 15, App.Vector(-20, -40, 58))
box5 = Part.makeBox(160, 18, 18, App.Vector(-160, -9, -9))
cyl3 = Part.makeCylinder(20, 55, App.Vector(-20, -40, 53), App.Vector(1, 0, 0))
cyl4 = Part.makeCylinder(20, 55, App.Vector(-20, 40, 53), App.Vector(1, 0, 0))
cyl5 = Part.makeCylinder(5, 35, App.Vector(0, 0, 38), App.Vector(1, 0, 0))
box6 = Part.makeBox(7, 88, 15, App.Vector(-22, -44, 75))
shape = box1.fuse([cyl1, box2, box3, box6]).cut(cyl2.fuse([box4, cyl3, cyl4, box5, cyl5]))
movableJaw = doc.addObject("Part::Feature", "MovableJaw")
movableJaw.Shape = shape.removeSplitter()
movableJaw.Placement.Base = App.Vector(150, 100, 0)
cyl1 = Part.makeCylinder(5, 190, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cyl2 = Part.makeCylinder(10, 20, App.Vector(190, 0, 0), App.Vector(1, 0, 0))
cyl3 = Part.makeCylinder(4, 100, App.Vector(200, 0, -50), App.Vector(0, 0, 1))
shape = cyl1.fuse([cyl2, cyl3])
leverScrew = doc.addObject("Part::Feature", "LeverScrew")
leverScrew.Shape = shape.removeSplitter()
leverScrew.Placement.Base = App.Vector(150, -100, 0)
wire1 = Part.makePolygon([App.Vector(0, 0, 100), App.Vector(0, 0, 0), App.Vector(100, 0, 0)])
crank = doc.addObject("Part::Feature", "Crank")
crank.Shape = wire1
crank.Placement.Base = App.Vector(0, -100, 0)
mat = fixedJaw.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
fixedJaw.ViewObject.ShapeAppearance = (mat,)
mat = movableJaw.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
movableJaw.ViewObject.ShapeAppearance = (mat,)
mat = leverScrew.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.70, 0.30, 0.20, 0.0)
leverScrew.ViewObject.ShapeAppearance = (mat,)
doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()
La commande Assemblage permet d'ajouter un assemblage au document.
Dans la vue en arborescence, glissez et déposez les pièces sur l'objet Assemblage. Elles peuvent maintenant être traitées par le solveur de l'assemblage.
Pour maintenir l'assemblage dans la position souhaitée, la partie FixedJaw doit être verrouillée/fixée. Sélectionnez FixedJaw dans la vue en arborescence ou dans la vue 3D et utilisez l'outil Bascule du blocage. Un objet GroundedJoint est ajouté au conteneur Joints.
Éléments sélectionnés + Créer une liaison pivot → manivelle réarrangée
Éléments sélectionnés + Créer une liaison glissière → mâchoire mobile réarrangée
Réglez la longueur minimale sur -77 mm et la longueur maximale sur -7 mm. Cela limite l'ouverture de l'étau à 70 mm.
Les trois liaisons suivantes sont nécessaires pour forcer la vis de manœuvre à : déplacer la mâchoire mobile, tourner la manivelle et tourner autour de l'axe principal.
Éléments sélectionnés + Créer une liaison distance → vis de manœuvre réarrangée
Sélectionnez deux faces. Réglez la valeur de la distance sur 20 mm.
Éléments sélectionnés + Créer une liaison parallèle → vis de manœuvre réarrangée
Éléments sélectionnés + Créer une liaison pivot glissant → vis de manœuvre réarrangée
Éléments sélectionnés (vis de manœuvre invisible) + Créer une liaison hélicoïdale → mécanisme complet de l'étau (vis de manœuvre visible)
Si nécessaire, rendre la vis de manœuvre invisible pendant la sélection.
Régler le rayon du pas à 5 mm
L'étau peut être actionné en déplaçant la manivelle ou la mâchoire mobile à l'aide de la souris gauche.
Cet exemple est temporaire et pourra être supprimé lorsque des descriptions/tutoriels appropriés seront disponibles.
Dans cet exemple, un amortisseur est créé.
L'assemblage se compose de trois éléments solides : un piston, un cylindre et un ressort. Trois autres éléments non solides, deux axes et une tige, sont également nécessaires. Toutes les pièces sont reliées par plusieurs articulations.
La charnière du piston tourne autour de l'axe 2, tandis que la charnière du cylindre se déplace sur un arc de cercle centré sur l'axe 1. La tige non solide est utilisée pour ce mouvement. La longueur de la tige correspond au rayon de l'arc de cercle.
Le code Python ci-dessous créera un nouveau document avec 6 objets. Créez une nouvelle macro et copiez-collez le code ci-dessous dans l'éditeur Python (pas dans la console Python). Puis exécuter la macro.
Le code ci-dessous ne peut pas être exécuté à partir de la console Python car le ressort doit être un objet Part::FeaturePython défini par une classe avec les fonctions de rappel execute()
et onChanged()
. Ce n'est qu'ensuite que sa hauteur peut être modifiée au moyen d'une propriété.
import math
import FreeCAD as App
import FreeCADGui as Gui
import Part
doc = App.newDocument()
class Spring():
def __init__(self, spring):
spring.addProperty("App::PropertyLength", "Height", "Spring", "Height of the helix").Height = 200.0
spring.Proxy = self
spring.ViewObject.Proxy = 0
def execute(self, spring):
helix = Part.makeHelix(spring.Height/8.5, spring.Height, 35)
startPnt = helix.Edges[0].Curve.value(0)
section = Part.Wire([Part.Circle(startPnt, App.Vector(0, 1, 0), 5).toShape()])
hel1 = helix.makePipeShell([section], True, True)
box1 = Part.makeBox(80, 80, 10, App.Vector(-40, -40, -10))
box2 = Part.makeBox(80, 80, 10, App.Vector(-40, -40, spring.Height))
shape = hel1.cut(box1).cut(box2)
spring.Shape = shape
def onChanged(self, spring, prop):
if prop == "Height":
self.execute(spring)
spring = doc.addObject("Part::FeaturePython", "Spring")
Spring(spring)
spring.Placement.Base = App.Vector(0, 100, 0)
axle1 = doc.addObject("Part::Line", "Axle1")
axle1.X2 = 0
axle1.Y2 = 80
axle1.Z2 = 0
axle2 = doc.addObject("Part::Line", "Axle2")
axle2.X2 = 0
axle2.Y2 = 80
axle2.Z2 = 0
axle2.Placement.Base = App.Vector(120, 0, -250)
rod = doc.addObject("Part::Line", "Rod")
rod.X2 = 100
rod.Y2 = 0
rod.Z2 = 0
rod.Placement.Base = App.Vector(0, -50, 0)
cyl1 = Part.makeCylinder(40, 10,App.Vector(0, 0, -5))
tor1 = Part.makeTorus(40, 5)
cyl2 = Part.makeCylinder(45, 5)
box1 = Part.makeBox(30, 10, 30,App.Vector(-15, -5, -35))
cyl3 = Part.makeCylinder(15, 10, App.Vector(0, -5, -35), App.Vector(0, 1, 0))
cyl4 = Part.makeCylinder(40, 5)
cyl5 = Part.makeCylinder(5, 10,App.Vector(0, -5, -35), App.Vector(0, 1, 0))
cyl6 = Part.makeCylinder(5, 130)
cyl7 = Part.makeCylinder(20, 5,App.Vector(0, 0, 130))
shape = cyl1.fuse([tor1,cyl2, box1, cyl3]).cut(cyl4.fuse([cyl5])).fuse([cyl6, cyl7])
piston = doc.addObject("Part::Feature", "Piston")
piston.Shape = shape.removeSplitter()
piston.Placement.Base = App.Vector(200, 100, -200)
cyl1 = Part.makeCylinder(40, 10,App.Vector(0, 0, -5))
tor1 = Part.makeTorus(40, 5)
cyl2 = Part.makeCylinder(45, 5)
box1 = Part.makeBox(30, 10, 30,App.Vector(-15, -5, -35))
cyl3 = Part.makeCylinder(15, 10,App.Vector(0, -5, -35), App.Vector(0, 1, 0))
cyl4 = Part.makeCylinder(40, 5)
cyl5 = Part.makeCylinder(5, 10,App.Vector(0, -5, -35), App.Vector(0, 1, 0))
cyl6 = Part.makeCylinder(25, 130)
tor2 = Part.makeTorus(20, 5,App.Vector(0, 0, 130))
cyl7 = Part.makeCylinder(20, 135)
cyl8 = Part.makeCylinder(20, 130)
cyl9 = Part.makeCylinder(5, 135)
shape = cyl1.fuse([tor1, cyl2, box1, cyl3]).cut(cyl4.fuse([cyl5])).fuse([cyl6, tor2, cyl7]).cut(cyl8.fuse([cyl9]))
cylinder = doc.addObject("Part::Feature", "Cylinder")
cylinder.Shape = shape.removeSplitter()
cylinder.Placement.Rotation.Axis = App.Vector(0, 1, 0)
cylinder.Placement.Rotation.Angle = math.pi
cylinder.Placement.Base = App.Vector(100, 100, 0)
mat = piston.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.80, 0.60, 0.15, 0.0)
piston.ViewObject.ShapeAppearance = (mat,)
mat = cylinder.ViewObject.ShapeAppearance[0]
mat.DiffuseColor = (0.55, 0.70, 0.70, 0.0)
cylinder.ViewObject.ShapeAppearance = (mat,)
doc.recompute()
view = Gui.ActiveDocument.ActiveView
view.viewIsometric()
view.fitAll()
La commande Assemblage permet d'ajouter un assemblage au document.
Dans la vue en arborescence, glissez et déposez les pièces sur l'objet Assemblage. Elles peuvent maintenant être traitées par le solveur de l'assemblage.
Pour maintenir l'assemblage dans la position souhaitée, les deux axes doivent être verrouillés/fixés. Sélectionnez les deux axes dans la vue en arborescence ou dans la vue 3D et utilisez l'outil Bascule du blocage. Deux objets GroundedJoint est ajouté au conteneur Joints.
Créer une liaison pivot + Éléments sélectionnés → Piston réarrangé
Créer une liaison glissière + Éléments sélectionnés → Cylindre réarrangé et déplacé
Faites attention à l'emplacement du système de coordonnées avant de sélectionner une face. Il doit se trouver au centre de chaque face.
Faites glisser le cylindre pour créer une certaine distance entre lui et le piston. Les faces d'appui du ressort doivent être visibles.
Créer une liaison distance + Faces sélectionnées → Distance du cylindre réarrangée et fixée à 200 mm
Réglez la valeur de la distance à 200 mm.
Les deux liaisons suivantes sont nécessaires pour forcer la charnière du cylindre à se déplacer sur un arc de cercle.
Créer une liaison pivot glissant + Éléments sélectionnés → Tige réarrangée
Assurez-vous que l'axe Z du système de coordonnées (bleu) est perpendiculaire à la tige en sélectionnant un point d'extrémité.
Créer une liaison pivot + Éléments sélectionnés → Cylindre réarrangé
Assurez-vous à nouveau que l'axe Z du système de coordonnées (bleu) est perpendiculaire à la tige.
Il se peut que vous rencontriez des problèmes avec cette liaison. Si c'est le cas, essayez ce qui suit :
Les deux liaisons suivantes sont nécessaires pour fixer le ressort à la face d'appui.
Créer une liaison parallèle + Faces sélectionnées → Ressort réarrangé
Sélectionnez le centre de la face d'appui du piston et le centre de la face inférieure du ressort. Maintenez la valeur de la distance à 0.
Créer une liaison fixe + Éléments sélectionnés → Ressort réarrangé
Sélectionnez le sommet inférieur du joint du cylindre dans le piston et le sommet du coin dans le ressort.
<<Distance>>.Distance
Pour ce faire, double-cliquez sur l'objet Distance dans l'arborescence et modifiez sa propriété Distance. Recalculez le document. Le ressort change de longueur.